Skip to content

Commit

Permalink
[PATCH] nfsd4: fix sync'ing of recovery directory
Browse files Browse the repository at this point in the history
We need to fsync the recovery directory after writing to it, but we weren't
doing this correctly.  (For example, we weren't taking the i_sem when calling
->fsync().)

Just reuse the existing nfsd fsync code instead.

Signed-off-by: J. Bruce Fields <[email protected]>
Signed-off-by: Neil Brown <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
NeilBrown authored and Linus Torvalds committed Jul 8, 2005
1 parent 4630902 commit a6ccbbb
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 22 deletions.
29 changes: 8 additions & 21 deletions fs/nfsd/nfs4recover.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,25 +119,12 @@ nfs4_make_rec_clidname(char *dname, struct xdr_netobj *clname)
return status;
}

static int
nfsd4_rec_fsync(struct dentry *dentry)
static void
nfsd4_sync_rec_dir(void)
{
struct file *filp;
int status = nfs_ok;

dprintk("NFSD: nfs4_fsync_rec_dir\n");
filp = dentry_open(dget(dentry), mntget(rec_dir.mnt), O_RDWR);
if (IS_ERR(filp)) {
status = PTR_ERR(filp);
goto out;
}
if (filp->f_op && filp->f_op->fsync)
status = filp->f_op->fsync(filp, filp->f_dentry, 0);
fput(filp);
out:
if (status)
printk("nfsd4: unable to sync recovery directory\n");
return status;
down(&rec_dir.dentry->d_inode->i_sem);
nfsd_sync_dir(rec_dir.dentry);
up(&rec_dir.dentry->d_inode->i_sem);
}

int
Expand Down Expand Up @@ -176,7 +163,7 @@ nfsd4_create_clid_dir(struct nfs4_client *clp)
up(&rec_dir.dentry->d_inode->i_sem);
if (status == 0) {
clp->cl_firststate = 1;
status = nfsd4_rec_fsync(rec_dir.dentry);
nfsd4_sync_rec_dir();
}
nfs4_reset_user(uid, gid);
dprintk("NFSD: nfsd4_create_clid_dir returns %d\n", status);
Expand Down Expand Up @@ -331,7 +318,7 @@ nfsd4_remove_clid_dir(struct nfs4_client *clp)
status = nfsd4_unlink_clid_dir(clp->cl_recdir, HEXDIR_LEN-1);
nfs4_reset_user(uid, gid);
if (status == 0)
status = nfsd4_rec_fsync(rec_dir.dentry);
nfsd4_sync_rec_dir();
if (status)
printk("NFSD: Failed to remove expired client state directory"
" %.*s\n", HEXDIR_LEN, clp->cl_recdir);
Expand Down Expand Up @@ -362,7 +349,7 @@ nfsd4_recdir_purge_old(void) {
return;
status = nfsd4_list_rec_dir(rec_dir.dentry, purge_old);
if (status == 0)
status = nfsd4_rec_fsync(rec_dir.dentry);
nfsd4_sync_rec_dir();
if (status)
printk("nfsd4: failed to purge old clients from recovery"
" directory %s\n", rec_dir.dentry->d_name.name);
Expand Down
2 changes: 1 addition & 1 deletion fs/nfsd/vfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -733,7 +733,7 @@ nfsd_sync(struct file *filp)
up(&inode->i_sem);
}

static void
void
nfsd_sync_dir(struct dentry *dp)
{
nfsd_dosync(NULL, dp, dp->d_inode->i_fop);
Expand Down
1 change: 1 addition & 0 deletions include/linux/nfsd/nfsd.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ int nfsd_statfs(struct svc_rqst *, struct svc_fh *,

int nfsd_notify_change(struct inode *, struct iattr *);
int nfsd_permission(struct svc_export *, struct dentry *, int);
void nfsd_sync_dir(struct dentry *dp);

#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
#ifdef CONFIG_NFSD_V2_ACL
Expand Down

0 comments on commit a6ccbbb

Please sign in to comment.