Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: (23 commits) ceph: document unlocked d_parent accesses ceph: explicitly reference rename old_dentry parent dir in request ceph: document locking for ceph_set_dentry_offset ceph: avoid d_parent in ceph_dentry_hash; fix ceph_encode_fh() hashing bug ceph: protect d_parent access in ceph_d_revalidate ceph: protect access to d_parent ceph: handle racing calls to ceph_init_dentry ceph: set dir complete frag after adding capability rbd: set blk_queue request sizes to object size ceph: set up readahead size when rsize is not passed rbd: cancel watch request when releasing the device ceph: ignore lease mask ceph: fix ceph_lookup_open intent usage ceph: only link open operations to directory unsafe list if O_CREAT|O_TRUNC ceph: fix bad parent_inode calc in ceph_lookup_open ceph: avoid carrying Fw cap during write into page cache libceph: don't time out osd requests that haven't been received ceph: report f_bfree based on kb_avail rather than diffing. ceph: only queue capsnap if caps are dirty ceph: fix snap writeback when racing with writes ...
This commit is contained in:
@@ -560,7 +560,8 @@ static int fill_inode(struct inode *inode,
|
||||
struct ceph_mds_reply_inode *info = iinfo->in;
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
int i;
|
||||
int issued, implemented;
|
||||
int issued = 0, implemented;
|
||||
int updating_inode = 0;
|
||||
struct timespec mtime, atime, ctime;
|
||||
u32 nsplits;
|
||||
struct ceph_buffer *xattr_blob = NULL;
|
||||
@@ -599,7 +600,8 @@ static int fill_inode(struct inode *inode,
|
||||
if (le64_to_cpu(info->version) > 0 &&
|
||||
(ci->i_version & ~1) >= le64_to_cpu(info->version))
|
||||
goto no_change;
|
||||
|
||||
|
||||
updating_inode = 1;
|
||||
issued = __ceph_caps_issued(ci, &implemented);
|
||||
issued |= implemented | __ceph_caps_dirty(ci);
|
||||
|
||||
@@ -707,17 +709,6 @@ static int fill_inode(struct inode *inode,
|
||||
ci->i_rfiles = le64_to_cpu(info->rfiles);
|
||||
ci->i_rsubdirs = le64_to_cpu(info->rsubdirs);
|
||||
ceph_decode_timespec(&ci->i_rctime, &info->rctime);
|
||||
|
||||
/* set dir completion flag? */
|
||||
if (ci->i_files == 0 && ci->i_subdirs == 0 &&
|
||||
ceph_snap(inode) == CEPH_NOSNAP &&
|
||||
(le32_to_cpu(info->cap.caps) & CEPH_CAP_FILE_SHARED) &&
|
||||
(issued & CEPH_CAP_FILE_EXCL) == 0 &&
|
||||
(ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) {
|
||||
dout(" marking %p complete (empty)\n", inode);
|
||||
/* ci->i_ceph_flags |= CEPH_I_COMPLETE; */
|
||||
ci->i_max_offset = 2;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
pr_err("fill_inode %llx.%llx BAD mode 0%o\n",
|
||||
@@ -774,6 +765,19 @@ no_change:
|
||||
__ceph_get_fmode(ci, cap_fmode);
|
||||
}
|
||||
|
||||
/* set dir completion flag? */
|
||||
if (S_ISDIR(inode->i_mode) &&
|
||||
updating_inode && /* didn't jump to no_change */
|
||||
ci->i_files == 0 && ci->i_subdirs == 0 &&
|
||||
ceph_snap(inode) == CEPH_NOSNAP &&
|
||||
(le32_to_cpu(info->cap.caps) & CEPH_CAP_FILE_SHARED) &&
|
||||
(issued & CEPH_CAP_FILE_EXCL) == 0 &&
|
||||
(ci->i_ceph_flags & CEPH_I_COMPLETE) == 0) {
|
||||
dout(" marking %p complete (empty)\n", inode);
|
||||
/* ci->i_ceph_flags |= CEPH_I_COMPLETE; */
|
||||
ci->i_max_offset = 2;
|
||||
}
|
||||
|
||||
/* update delegation info? */
|
||||
if (dirinfo)
|
||||
ceph_fill_dirfrag(inode, dirinfo);
|
||||
@@ -805,14 +809,14 @@ static void update_dentry_lease(struct dentry *dentry,
|
||||
return;
|
||||
|
||||
spin_lock(&dentry->d_lock);
|
||||
dout("update_dentry_lease %p mask %d duration %lu ms ttl %lu\n",
|
||||
dentry, le16_to_cpu(lease->mask), duration, ttl);
|
||||
dout("update_dentry_lease %p duration %lu ms ttl %lu\n",
|
||||
dentry, duration, ttl);
|
||||
|
||||
/* make lease_rdcache_gen match directory */
|
||||
dir = dentry->d_parent->d_inode;
|
||||
di->lease_shared_gen = ceph_inode(dir)->i_shared_gen;
|
||||
|
||||
if (lease->mask == 0)
|
||||
if (duration == 0)
|
||||
goto out_unlock;
|
||||
|
||||
if (di->lease_gen == session->s_cap_gen &&
|
||||
@@ -839,11 +843,13 @@ out_unlock:
|
||||
/*
|
||||
* Set dentry's directory position based on the current dir's max, and
|
||||
* order it in d_subdirs, so that dcache_readdir behaves.
|
||||
*
|
||||
* Always called under directory's i_mutex.
|
||||
*/
|
||||
static void ceph_set_dentry_offset(struct dentry *dn)
|
||||
{
|
||||
struct dentry *dir = dn->d_parent;
|
||||
struct inode *inode = dn->d_parent->d_inode;
|
||||
struct inode *inode = dir->d_inode;
|
||||
struct ceph_dentry_info *di;
|
||||
|
||||
BUG_ON(!inode);
|
||||
@@ -1022,9 +1028,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
|
||||
|
||||
/* do we have a dn lease? */
|
||||
have_lease = have_dir_cap ||
|
||||
(le16_to_cpu(rinfo->dlease->mask) &
|
||||
CEPH_LOCK_DN);
|
||||
|
||||
le32_to_cpu(rinfo->dlease->duration_ms);
|
||||
if (!have_lease)
|
||||
dout("fill_trace no dentry lease or dir cap\n");
|
||||
|
||||
@@ -1560,7 +1564,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
struct inode *parent_inode = dentry->d_parent->d_inode;
|
||||
struct inode *parent_inode;
|
||||
const unsigned int ia_valid = attr->ia_valid;
|
||||
struct ceph_mds_request *req;
|
||||
struct ceph_mds_client *mdsc = ceph_sb_to_client(dentry->d_sb)->mdsc;
|
||||
@@ -1743,7 +1747,9 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
req->r_inode_drop = release;
|
||||
req->r_args.setattr.mask = cpu_to_le32(mask);
|
||||
req->r_num_caps = 1;
|
||||
parent_inode = ceph_get_dentry_parent_inode(dentry);
|
||||
err = ceph_mdsc_do_request(mdsc, parent_inode, req);
|
||||
iput(parent_inode);
|
||||
}
|
||||
dout("setattr %p result=%d (%s locally, %d remote)\n", inode, err,
|
||||
ceph_cap_string(dirtied), mask);
|
||||
|
Reference in New Issue
Block a user